#ifndef CURVEPLOTMANAGER_H
#define CURVEPLOTMANAGER_H

#include <QObject>
#include <QWidget>
#include <QMap>
#include <QSharedPointer>
#include <QTimer>
#include <QVariantMap>

#include "curveplot.h"
#include "dynamiclayout.h"

class CurvePlotManager : public QWidget
{
    Q_OBJECT
public:
    explicit CurvePlotManager(QWidget *parent = nullptr);
    ~CurvePlotManager();
    // 添加图表
    CurvePlot *addCurvePlot(QString newCurvePlot);

    // 删除图表
    void removeCurvePlot(QString delCurvePlot);

    // 添加数据
    void addData(const QString &curvePlotName, const QString &graphName,const double &x, const double &y);

    // 刷新
    void replot();

    // 获取所有图表信息，曲线信息
    QVariantMap getCurvePlotInfo();

    // 单一显示模式枚举
    enum LayoutType{One, Rese};

    // 更改布局
    void setLayouModel(LayoutType type);


    // 持久化相关
    QVariantMap toVariantMap() const;
    static QSharedPointer<CurvePlot> fromVariantMap(const QVariantMap& map);

    // 当前选中画布
    CurvePlot *currSeleted() const;
    void setCurrSeleted(CurvePlot *currSeleted);

    // 图表集合
    QMap<QString, CurvePlot *> curverPlots() const;
    void setCurverPlots(const QMap<QString, CurvePlot *> &curverPlots);

    // 名称
    QString name() const;
    void setName(const QString &name);

signals:
    //    /** 输出日志 */
    //    void sig_logMessage(const QString &msg);
    //    /** 启停信号 */
    //    void sig_run(bool b);
    void dataEmptied(QWidget *delWidget); // 数据清空信号

    void seletWidget(QWidget *seleWidget);
protected:
    bool eventFilter(QObject *object, QEvent *event);

private slots:
    void do_setCurrentSeletState(bool b);

private:
    // 布局类
    DynamicLayout *m_DyLayout;

    // 当前选中的曲线图
    CurvePlot *m_currSeleted;

    // 当前布局类型
    LayoutType m_LayoutType;

    // 存储图表控件
    QMap<QString, CurvePlot *> m_curverPlots;

    // 观测曲线缓存
    QMap<QString, QMap<double, double>> dataMap;

    const int MAX_CHARTS = 4;  // 最大图表数量

    int m_CurrMaxLen;  // 当前数据存储最大长度

    QTimer *m_plotTimer;  // 刷新定时器

    QString m_name; // 图表管理窗口名称
};

#endif // CURVEPLOTMANAGER_H
